[アップデート] アベイラビリティゾーン間で不均衡な ECS タスクの再調整をサポートしました

[アップデート] アベイラビリティゾーン間で不均衡な ECS タスクの再調整をサポートしました

アベイラビリティゾーン間で不均衡な ECS タスク数の再調整をサポートしました。今まで手動実装が必要だった部分がどんどん、マネージドになってきて嬉しいです。
Clock Icon2024.11.24

こんにちは!AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。

Amazon ECS でアベイラビリティゾーン間で不均衡な ECS タスクの再調整をサポートしました。

https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-ecs-az-rebalancing-speeds-mean-time-recovery-event/

控えめに言って神ですね。早速アップデートの内容に入っていきましょう。

何が嬉しいのか

まず初めに on EC2, on Fargate かかわらず、ECS タスクを複数のアベイラビリティゾーンで均等に分散する仕組みはベストエフォートです。

EC2

Task placement strategies are a best effort. Amazon ECS still attempts to place tasks even when the most optimal placement option is unavailable. However, task placement constraints are binding, and they can prevent task placement.

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement.html#ec2-launch-type

Fargate

Task placement strategies and constraints aren't supported for tasks using the Fargate launch type. Fargate will try its best to spread tasks across accessible Availability Zones. If the capacity provider includes both Fargate and Fargate Spot, the spread behavior is independent for each capacity provider.

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement.html#fargate-launch-type

この仕様があるため、 ECS タスクをアベイラビリティゾーンごとに厳格に均等配置したい場合、自前でタスクを置き換えるような仕組みの実装が必要でした。たとえば次のような例です。

  1. EventBridge Scheduler, Step Functions 等で定期的にタスクの偏りが発生していないかチェック、再配置する仕組みの実装
  2. 負荷が低い時間帯で、 ECS タスクの Desired Count を増加させ、 Application Auto Scaling のスケールインで再配置を行う

ただし、必ず 1 回で成功するかと言われると、先ほどのベストエフォートに従うため言い切れず、ベストエフォートなスケジューリングのチャンスを増やすイメージです。

今回のアップデートで、この仕組みの実装がマネージドで利用可能になりました。(嬉しい)

アップデート内容

ECS サービスに availabilityZoneRebalancing プロパティが追加されました。プロパティ 1 つで実装できるのいいですね。(既存の ECS サービスにも適用可能です。

availabilityZoneRebalancing
Indicates whether to use Availability Zone rebalancing for the service.
For more information, see Balancing an Amazon ECS service across Availability Zones in the Amazon Elastic Container Service Developer Guide.
Type: String
Valid Values: ENABLED | DISABLED
Required: No

CreateService - Amazon Elastic Container Service

UpdateService - Amazon Elastic Container Service

ただし、いくつか制約事項があります。設定変更前に合わせて確認しておきましょう。

利用可能な状態

  • on Fargate
    • deploymentConfigurationmaximumPercent の値が 100% より大きいこと(デフォルトは 200 %)
  • on EC2
    • deploymentConfigurationmaximumPercent の値が 100% より大きいこと(デフォルトは 200 %)
    • スケジューリングに Replica 戦略を利用する ECS サービス
    • placementStrategy を指定していない
    • placementStrategy の最初の項目に attribute:ecs.availability-zonespread で指定している (※1)

※1 の OK, NG の例は以下になります。

OK

"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    },
    {
        "field": "memory",
        "type": "binpack"
    }
]

NG

"placementStrategy": [
    {
        "field": "memory",
        "type": "binpack"
    },
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    }
]

利用不可な状態

  • on EC2
    • スケジューリングに Daemon 戦略を利用する ECS サービス
    • 起動タイプが ECS Anywhere (EXTERNAL) を利用していること
  • Classic Load Balancer を使っていること

やってみる

今回は ECS タスク数がアベイラビリティゾーンごとに偏りのある、 ECS サービスを作成し availabilityZoneRebalancing を有効にして挙動を確認してみます。

まずは偏りのある ECS サービスを作成します。今回は us-east-1 リージョンを使いました。ARM コンテナを使っています。

起動しているタスク数が 12, アベイラビリティゾーンが 6 の状態に対して、 us-east-1a に 3 つのタスク、 us-east-1f に 4 つのタスク、us-east-1c に 1 つのタスク、us-east-1e はタスク数 0 と偏りが生じていますね。

2024-11-24 at 16.42.37-サービスタスク  Elastic Container Service  us-east-1@2x.png

私の場合、 us-east-1euse1-az3 だったため、サポートしていないリージョンとして、タスク数 0 は想定で通りです。

  • For the Fargate launch type, the following AWS Regions do not support 64-bit ARM workloads:
    • US East (N. Virginia), the use1-az3 Availability Zone

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-arm64.html#ecs-arm64-considerations

執筆時点の CloudShell が v2.21.2 だったため、 v2.22.2 まで引き上げます。

[cloudshell-user@ip-10-136-53-47 ~]$ aws --version
aws-cli/2.21.2 Python/3.12.6 Linux/6.1.112-124.190.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update

v2.22.2 以上になっていれば OK です。

[cloudshell-user@ip-10-136-53-47 ~]$ aws --version
aws-cli/2.22.4 Python/3.12.6 Linux/6.1.112-124.190.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

https://github.com/aws/aws-cli/commit/0a2328beeab109b8156f68180c5fd678337077d7#diff-c46e94a1d3cf649bbc61d6d6d2f8047136dbfa91f2ec5db87606bed35ae1a29cR8-R11

現在値を見ると availabilityZoneRebalancing は無効化されている状態です。

[cloudshell-user@ip-10-136-53-47 ~]$ aws ecs describe-services --services ecs --cluster ecs --query services[0].availabilityZoneRebalancing
"DISABLED"

更新してみる

それでは、 availabilityZoneRebalancingENABLED に変更してみます。

aws ecs update-service \
  --service ecs \
  --cluster ecs \
  --availability-zone-rebalancing "ENABLED"

すぐに有効できました。

[cloudshell-user@ip-10-136-53-47 ~]$ aws ecs describe-services --services ecs --cluster ecs --query services[0].availabilityZoneRebalancing
"ENABLED"

また、マネジメントコンソールからも設定値を確認できますね。

2024-11-23 at 18.16.41-サービス構成  Elastic Container Service  us-east-1@2x.png

サービスのリバランス

初回デプロイから 15 分後ほど経過したのちに、 ECS タスクの AZ 不均衡を検知していました。

us-east-1e はサポートしていないよ!と怒られていますね。

2024-11-24 at 17.04.03-サービスデプロイ  Elastic Container Service  us-east-1@2x.png

イメージしていた us-east-1f のタスクが 1 つ減少し、us-east-1c に 1 つタスクが増加していますね。

2024-11-24 at 17.05.50-サービスタスク  Elastic Container Service  us-east-1@2x.png

なお、アベイラビリティゾーン間のタスク再調整イベントは、タスク状態変更で次の stoppedReason が拾えるようです。

Availability Zone rebalancing initiated by (deployment ecs-svc/deployment-id)

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/track-service-rebalancing.html

まとめ

以上、「Amazon ECS でアベイラビリティゾーン間で不均衡な ECS タスクの再調整をサポートしました。」でした。

個人的には、デメリットほぼない機能だと思いますので、多くの方が有効になるアップデートだと思います。

このブログがどなたかの参考になれば幸いです。

AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.